package com.honeybee.cloud.framework.common.mapper;

import cn.hutool.core.date.DateUtil;
import cn.hutool.log.StaticLog;
import com.honeybee.cloud.framework.common.utils.StrUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Named;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;

/**
 * @Description 一些mapper转换时的基础方法
 * 当一些参数无法自动化转时，可以使用自定义方法再加上 qualifiedByName 一起使用
 * 例如   @Mapping(source = "startDate", target = "startDate", qualifiedByName = "toDate")
 * 这里是个方法例子
 * @Author DELL
 * @Create 2019-04-28
 * @Since 1.0.0
 */
@SuppressWarnings("all")
public interface BaseCovertMapper {
    /**
     * 百分比数转int
     *
     * @param str
     * @return
     */
    @Named("toLong")
    default Long toLong(String str) {
        return StrUtils.convertNumber(str, 2);
    }

    @Named("longToInt")
    default Integer longToInt(Long number) {
        if (Objects.isNull(number)) {
            return null;
        }
        return number.intValue();
    }
    @Named("toString")
    default String toString(Object number) {
        if (Objects.isNull(number)) {
            return null;
        }
        return Objects.toString(number);
    }
    /**
     * 时间戳转date
     *
     * @param time
     * @return
     */
    @Named("toDate")
    default Date toDate(Long time) {
        if (Objects.isNull(time)) {
            return null;
        }
        return new Date(time);
    }

    /**
     * 字符串转date
     *
     * @param time
     * @return
     */
    @Named("toDate")
    default Date toDate(String time) {
        if (Objects.isNull(time)) {
            return null;
        }
        if (StringUtils.isNumeric(time)) {
            return toDate(Long.parseLong(time));
        }
        if (StringUtils.length(time) == 10) {
            try {
                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                LocalDate localDate = LocalDate.parse(time, dtf);
                ZoneId zone = ZoneId.systemDefault();
                Instant instant = localDate.atStartOfDay().atZone(zone).toInstant();
                return Date.from(instant);
            } catch (Exception e) {
                StaticLog.error("时间转换异常", e);
                throw new IllegalArgumentException("时间格式不正确");
            }
        }
        if (StringUtils.length(time) == 19) {
            try {
                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTime localDate = LocalDateTime.parse(time, dtf);
                ZoneId zone = ZoneId.systemDefault();
                Instant instant = localDate.atZone(zone).toInstant();
                return Date.from(instant);
            } catch (Exception e) {
                StaticLog.error("时间转换异常", e);
                throw new IllegalArgumentException("时间格式不正确");
            }
        }
        return null;
    }

    /**
     * 获取年龄
     *
     * @param date
     * @return
     */
    default Integer age(Date date) {
        return Math.abs(DateUtil.age(date, new Date()))+1;
    }
}
